<?php

/**
 * Sunny软件公司欲开发了一个数据加密模块，可以对字符串进行加密。
 * 最简单的加密算法通过对字母进行移位来实现，同时还提供了稍复杂的逆向输出加密，
 * 还提供了更为高级的求模加密。用户先使用最简单的加密算法对字符串进行加密，
 * 如果觉得还不够可以对加密之后的结果使用其他加密算法进行二次加密，
 * 当然也可以进行第三次加密。试使用装饰模式设计该多重加密系统。
 *
 */

interface IEncryption
{
	public function encryption($str);
}

class OneLevelEncryption implements IEncryption
{
	public function encryption($str)
	{
		echo "对字符串{$str}进行一级加密。<br/>";
		return "对字符串{$str}进行一级加密。<br/>";
	}
}

class Decorator implements IEncryption
{
	private $_encryption;
	
	public function __construct(IEncryption $encryption)
	{
		$this->_encryption = $encryption;
	}
	
	public function encryption($str)
	{
		return $this->_encryption->encryption($str);
	}
}

class TwoLevelEncryption extends Decorator
{
	public function encryption($str)
	{
		$str = parent::encryption($str);
		return $this->reverseOutput($str);
	}
	
	public function reverseOutput($str)
	{
		echo "逆向输出加密。<br/>";
		return "逆向输出加密。<br/>";
	}
}

class ThreeLevelEncryption extends Decorator
{
	public function encryption($str)
	{
		$str = parent::encryption($str);
		return $this->modulo($str);
	}
	
	public function modulo($str)
	{
		echo "求模加密。<br/>";
		return "求模加密。<br/>";
	}
}

class Client
{
	public static function main()
	{
		$str = 'aabbcc';
		$one = new OneLevelEncryption();
		$two = new TwoLevelEncryption($one);
		$three = new ThreeLevelEncryption($two);
		$three->encryption($str);
	}
}

Client::main();